home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 2 / Deutsche Edition 2.iso / mac / POWERMAC / C64 / SOURCE / Main.c < prev    next >
C/C++ Source or Header  |  1994-06-06  |  5KB  |  199 lines

  1. /*
  2.     Commodore 64 Emulator v0.4      Earle F. Philhower III 
  3.     Copyright (C) 1993-4            (st916w9r@dunx1.ocs.drexel.edu)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include <AppleEvents.h>
  21. #include "Processor.h"
  22. #include "Error.h"
  23. #include "Resources.h"
  24. #include "Preferences.h"
  25.  
  26. Rect dragRect;
  27. EventRecord event;
  28. Cursor commieCursor, diskCursor;
  29. int programMode;
  30. void Initialize(), CleanUpCommodore();
  31.  
  32. main()
  33. {
  34.     Initialize();
  35.     ProcessorLoop();
  36.     EventLoop();
  37.     CleanUpCommodore();
  38. }
  39.  
  40. void Initialize()
  41. {
  42.     int err;
  43.     DialogPtr dialog;
  44.     
  45.     /* Do standard Macintosh initializations */
  46.     InitGraf(&qd.thePort);
  47.     InitFonts();
  48.     InitWindows();
  49.     InitMenus();
  50.     TEInit();
  51.     InitDialogs(nil);
  52.     InitCursor();
  53.  
  54.     /* Set up the menus, drag area */
  55.     dragRect=qd.screenBits.bounds;
  56.     InsetRect(&dragRect, 2, 2);    
  57.  
  58.     /* Display the splash screen, even if for just a second... */
  59.     dialog=GetNewDialog(kSplashDialog, nil, (WindowPtr)-1L);
  60.     ShowWindow(dialog);
  61.     DrawDialog(dialog);
  62.     
  63.     /* Do emulator initializations */
  64.     if (err=CursorInitialize()) ExitError(err);
  65.     if (err=MemoryInitialize()) ExitError(err);
  66.     if (err=MenuInitialize()) ExitError(err);
  67.     if (err=VICInitialize()) ExitError(err);
  68.     if (err=DirInitialize()) ExitError(err);
  69.     if (err=AppleEventInitialize()) ExitError(err);
  70.     if (err=InstructionInitialize()) ExitError(err);
  71.     if (err=RegisterInitialize()) ExitError(err);
  72.     if (err=TrapInitialize()) ExitError(err);
  73.     if (err=SerialInitialize()) ExitError(err);
  74.     if (err=PrinterInitialize()) ExitError(err);
  75.     if (err=FloppyInitialize()) ExitError(err);
  76.     if (err=HardInitialize()) ExitError(err);
  77.     if (err=PrefInitialize()) ExitError(err);
  78.  
  79.     /* Done with splash screen, so free its memory */
  80.     HideWindow(dialog);
  81.     DisposDialog(dialog);
  82. }
  83.  
  84. int CursorInitialize()
  85. {
  86.     CursHandle cursorHandle;
  87.     
  88.     cursorHandle=GetCursor(kCommieCursor);
  89.     if (cursorHandle==nil) return kMissingResource;
  90.     commieCursor=**cursorHandle;
  91.     DisposHandle((Handle)cursorHandle);
  92.     
  93.     cursorHandle=GetCursor(kDiskCursor);
  94.     if (cursorHandle==nil) return kMissingResource;
  95.     diskCursor=**cursorHandle;
  96.     DisposHandle((Handle)cursorHandle);
  97.  
  98.     return kNoError;
  99. }
  100.  
  101. EventLoop()
  102. {
  103.     int done=0;
  104.     char theChar;
  105.     WindowPtr theWind;
  106.     
  107.     while (!done)
  108.     {
  109.         WaitNextEvent(everyEvent, &event, 60L, nil);
  110.         switch(event.what)
  111.         {
  112.             case nullEvent:
  113.                 break;
  114.                 
  115.             case mouseDown:
  116.                 /* Call our own mouseDown handler */
  117.                 HandleMouseDown();
  118.                 break;
  119.                 
  120.             case autoKey:
  121.             case keyDown:
  122.                 /* We're only concerned with Option-X characters */
  123.                 theChar = event.message&charCodeMask;
  124.                 if (event.modifiers&cmdKey) DoMenuChoice(MenuKey(theChar));
  125.                 break;
  126.                 
  127.             case updateEvt:
  128.                 theWind=(WindowPtr)event.message;
  129.                 BeginUpdate(theWind);
  130.                 switch (GetWRefCon(theWind))
  131.                 {
  132.                     case kVICWindow:
  133.                         RedrawVIC();
  134.                         break;
  135.                     case kDirWindow:
  136.                         RedrawDir();
  137.                         break;
  138.                 }
  139.                 EndUpdate(theWind);
  140.                 break;
  141.                 
  142.             case kHighLevelEvent :
  143.                 /* Apple Events have their own dispatcher in the OS */
  144.                 AEProcessAppleEvent(&event);
  145.                 break;
  146.  
  147.             case app4Evt:
  148.                 if (event.message&1) SetCursor(&(qd.arrow));
  149.                 break;
  150.         }
  151.     }
  152. }
  153.  
  154. HandleMouseDown()
  155. {
  156.     WindowPtr theWind;
  157.     short thePart;
  158.     
  159.     thePart=FindWindow(event.where, &theWind);
  160.     switch(thePart)
  161.     {
  162.         case inSysWindow:
  163.             SystemClick(&event, theWind);
  164.             break;
  165.             
  166.         case inDrag:
  167.             if (GetWRefCon(theWind)==kVICWindow) DragVICWindow(&event);
  168.             else DragWindow(theWind, event.where, &dragRect);
  169.             break;
  170.         
  171.         case inGoAway:
  172.             if (TrackGoAway(theWind, event.where)) HideWindow(theWind);
  173.             break;
  174.             
  175.         case inMenuBar:
  176.             DoMenuChoice(MenuSelect(event.where));
  177.             break;
  178.             
  179.         case inContent:
  180.             SelectWindow(theWind);
  181.             switch (GetWRefCon(theWind))
  182.             {
  183.                 case kVICWindow:
  184.                     ProcessorLoop();
  185.                     break;
  186.                 case kDirWindow:
  187.                     FloppyClick(event);
  188.                     break;
  189.             }
  190.             break;
  191.         }
  192. }
  193.  
  194. void CleanUpCommodore()
  195. {
  196.     AttachFloppyImage(nil);
  197. }
  198.  
  199.